import raxios from "./raxios";

var _toString = Function.prototype.call.bind(Object.prototype.toString)

function getType(target) {
    return _toString(target).slice(8, -1).toLowerCase()
}
/**
 * 判断目标是否为Object
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isObject = function (target) {
    return getType(target) === 'object';
}
/**
 * 判断目标是否为Number
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isNumber = function (target) {
    return getType(target) === 'number';
}

/**
 * 判断目标是否为Function
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isFunction = function (target) {
    return getType(target) === 'function';
}

/**
 * 判断目标是否为String
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isString = function (target) {
    return getType(target) === 'string';
}

/**
 * 判断目标是否为undefined
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isUndefined = function (target) {
    return getType(target) === 'undefined';
}

/**
 * 判断目标是否为Null
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isNull = function (target) {
    return getType(target) === 'null';
}

/**
 * 判断目标是否为布尔类型
 * @param {*} target 验证目标
 * @returns {Boolean}
 */
export var isBoolean = function (target) {
    return getType(target) === 'boolean';
}
/**
 * 将类数组对象转成数组
 * @param {Object} arrlike 类似数组的对象
 * @returns {Array}
 */
export const slice = Function.prototype.call.bind(Array.prototype.slice);


var regExps = {
    'int': /^[0-9]{0,11}$/,
    'tel': /^\d{11}$/,
    'bankcard': /^\d{16}|\d{19}$/,
    'IDCard': /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
    'words': /[^A-Za-z0-9]/
}

/**
 * 是否浮点数
 * @param {*} val 
 * @param {Number} p 小数点后几位 
 * @returns {Boolean}
 */
export var isFloat = function (val, p) {
    var freg = new RegExp("^\\d{1,10}\\.\\d{0, " + (p || 2) + "}$ ");
    //(?:^\\d{1,8}\\.\\d{0, "+(p||2)+ "}$) 
    return regExps.int.test(val) || freg.test(val);
}

/**
 * 是否整数
 * @param {*} val 
 * @returns {Boolean}
 */
export var isInt = function (val) {
    return regExps.int.test(val)
}

/**
 * 是否电话号码
 * @param {*} val  
 * @returns {Boolean}
 */
export var isTel = function (val) {
    return regExps.tel.test(val)
}

/**
 * 是否数字字母组合
 * @param {*} val 
 * @returns {Boolean}
 */
export var isWords = function (val) { //字母数字
    return !regExps.words.test(val)
}

/**
 * 是否银行卡
 * @param {*} val 
 * @returns {Boolean}
 */
export var isBankcard = function (val) {
    return regExps.bankcard.test(val)
}

/**
 * 是否身份证
 * @param {*} val 
 * @returns {Boolean}
 */
export var isIDCard = function (val) {
    return regExps.IDCard.test(val)
}

/**
 * 是否email
 * @param {*} val 
 * @returns {Boolean}
 */
export var isEmail = function (val) {
    return val.indexOf('@') !== -1 && val.indexOf('.') !== -1;
}
/**
 * 替换圆角输入的数值
 * @param {String} val 
 */
export var replaceRoundAngleNumber = function (val) {
    return val.replace(/[０１２３４５６７８９．。：]/g, function (item) {
        return {
            '０': '0',
            '１': '1',
            '２': '2',
            '３': '3',
            '４': '4',
            '５': '5',
            '６': '6',
            '７': '7',
            '８': '8',
            '９': '9',
            '．': '.',
            '。': '.',
            '：': ':'
        } [item]
    })
}
/**
 * 撤销金额的格式化
 * @param {String} val
 * @returns {String}
 */
export var unFormartMoney = function (val) {
    return val.replace(/\,\d{3}/g, function (item) {
        return item.replace(',', '')
    })
}

/**
 * 是否含有表情
 * @param {*} val 
 * @returns {Boolean}
 */
export var hasEmoji = function (val) {
    return /\ud83c[\udc00-\udfff]|\ud83d[\udc00-\udfff]|[\u2600-\u27ff]/.test(val);
}

/**
 * 请求对象
 * 
 * 1、全局配置
 * @example
 *  $rxTool.ajax.globalConfig({
 *      onStart,   //请求开始时调用的勾子
 *      onComplete,//请求完成时调用的勾子
 *      onParams,  //请求之前的参数处理
 *      onUrl,     //请求之前的地址处理
 *      onResult   // 请求结果处理（-1 不处理，String 当成错误结果处理，Object 当成结果处理）
 * })
 * 
 * 2、post、get、download
 * @example
 * // return promise 
 * $rxTool.[post|get|download](url,params,config)
 * //config 的配置会覆盖global配置 完全不用global的配置可以 设置global=false
 */
export var ajax = {
    ...raxios
}

/**
 * 深拷贝
 * @param {*} obj 
 */
export function clone(obj) {
	var o;
	switch (typeof obj) {
		case 'undefined':
			break;
		case 'string':
			o = obj + '';
			break;
		case 'number':
			o = obj - 0;
			break;
		case 'boolean':
			o = obj;
			break;
		case 'object':
			if (obj === null) {
				o = null;
			} else {
				if (obj instanceof Array) {
					o = [];
					for (var i = 0, len = obj.length; i < len; i++) {
						o.push(clone(obj[i]));
					}
				} else {
					o = {};
					for (var k in obj) {
						o[k] = clone(obj[k]);
					}
				}
			}
			break;
		default:
			o = obj;
			break;
	}
	return o;
};